package cn.cloudreal.cbms.system.dao.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import cn.cloudreal.cbms.common.util.PageBean;
import cn.cloudreal.cbms.system.dao.RoleDao;
import cn.cloudreal.cbms.vo.Role;

/**
 * <p>
 * Title:CBMS
 * </p>
 * <p>
 * Description:角色查询数据Dao层实现类
 * </p>
 * <p>
 * Copyright: Copyright (c) 2010
 * </p>
 * <p>
 * Company:云恒瑞通
 * </p>
 * 
 * @author gaoxuejiao
 * @date 2012-07-16
 */
public class RoleDaoImpl extends SqlMapClientDaoSupport implements RoleDao
{

    /** 日志工具类实例 */
    private static final Logger log = Logger.getLogger(RoleDaoImpl.class);

    // 角色总数
    private static final String GET_ROLE_COUNT = "role.getRoleCount";

    // 角色总数
    private static final String GET_USEROLE_COUNT = "role.getRoleUseCount";

    // 判断是否存在使用该角色的用户信息
    private static final String GET_USER_USER = "role.isExistUse";

    // 角色列表
    private static final String GET_ROLE_LIST = "role.getRoleList";

    // 修改角色信息
    private static final String UPDATE_ROLE = "role.updateRole";

    // 删除角色角色中间表
    private static final String DEL_ROLE_PRIV = "role.delteRolePriv";

    // 删除角色信息
    private static final String DEL_ROLE = "role.delteRole";

    // 查询单个角色信息
    private static final String GET_ROLE = "role.getRole";

    // 查询所有角色信息
    private static final String GET_ROLE_All = "role.getAllRole";

    // 查询根据code
    private static final String GET_ROLE_BY_CODE = "role.getRoleByCode";

    // 新增角色信息
    private static final String ADD_ROLE = "role.insertRole";

    // 新增角色角色中间表信息
    private static final String ADD_ROLE_PRIV = "role.insertRolePriv";

    /**
     * 查询列表数据
     * 
     * @param page
     * @return List<Role>
     */
    public List<Role> getRoles(Role role, PageBean page)
    {
        List<Role> RoleList = null;

        // 打印进入方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Enter RoleleDaoImpl getRoles() method,return List<Role>");
        }
        log.debug(page);
        // 查询总条数
        Integer count = (Integer) getSqlMapClientTemplate().queryForObject(GET_ROLE_COUNT,
                role);

        if (null == count || count.intValue() < 1)
        {
            return null;
        }
        // 添加条数信息
        page.setTotalRecords(count.intValue());

        // 添加参数
        Map<String, Object> param = new HashMap<String, Object>();
        param.put("begin", page.getPageSize() * (page.getPageNo() - 1) + 1);
        param.put("end", page.getPageSize() * page.getPageNo());

        param.put("role", role);

        // 执行查询列表时间
        RoleList = getSqlMapClientTemplate().queryForList(GET_ROLE_LIST, param);

        // 打印退出方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Exit RoleleDaoImpl getRoles() method,return List<Role>");
        }
        return RoleList;
    }

    /**
     * 根据id查询单个数据
     * 
     * @param page
     * @return Role
     */
    public Role getRole(Integer id)
    {
        // 打印进入方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Enter RoleleDaoImpl getRole() method,return Role");
        }

        // 执行当个Role 对象查询
        Role role = (Role) getSqlMapClientTemplate().queryForObject(GET_ROLE,
                id);
        // 打印退出方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Exit RoleleDaoImpl getRole() method,return Role");
        }
        return role;
    }

    /**
     * 查询所有角色列表结合
     * 
     * @return RoleList
     */
    public List<Role> getAllRoles(Role role)
    {
        List<Role> RoleList = null;

        // 打印进入方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Enter RoleleDaoImpl getAllRoles() method,return RoleList");
        }
        RoleList = new ArrayList<Role>();

        // 执行当个Role 对象查询
        RoleList = getSqlMapClientTemplate().queryForList(GET_ROLE_All, role);
        // 打印退出方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Exit RoleleDaoImpl getAllRoles() method,return RoleList");
        }

        return RoleList;
    }

    /**
     * 查询 根据code
     * 
     * @return RoleList
     */
    public Role getAllRoleByCode(String code)
    {
        List<Role> RoleList = null;

        // 打印进入方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Enter RoleleDaoImpl getAllRoles() method,return RoleList");
        }

        // 执行当个Role 对象查询
        Role role = (Role) getSqlMapClientTemplate().queryForObject(GET_ROLE_BY_CODE,
                code);
        // 打印退出方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Exit RoleleDaoImpl getAllRoles() method,return RoleList");
        }

        return role;
    }

    /**
     * 更新数据
     * 
     * @param role
     * @return
     */
    public void updateRole(Role role)
    {
        // 打印进入方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Enter RoleleDaoImpl updateRole() method");
        }

        // 修改角色信息表
        getSqlMapClientTemplate().update(UPDATE_ROLE, role);

        // 删除角色权限中间表
        getSqlMapClientTemplate().delete(DEL_ROLE_PRIV, role.getRolecode());

        // 获取权限字符串截取
        if (null != role.getPurviewId())
        {
            String[] purStr = role.getPurviewId().split(",");

            for (int i = 0; i < purStr.length; i++)
            {
                role.setActionId(purStr[i]);

                // 新增角色权限中间表
                getSqlMapClientTemplate().insert(ADD_ROLE_PRIV, role);
            }
        }

        // 打印退出方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Exit RoleleDaoImpl updateRole() method");
        }
    }

    /**
     * 删除数据
     * 
     * @param page
     * @return
     */
    public void delRole(Role role)
    {
        // 打印进入方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Enter RoleleDaoImpl delRole() method");
        }
        // 删除角色权限中间表
        getSqlMapClientTemplate().delete(DEL_ROLE_PRIV, role.getRolecode());

        // 执行删除操作
        getSqlMapClientTemplate().delete(DEL_ROLE, role.getRolecode());
        // 打印退出方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Exit RoleleDaoImpl delRole() method");
        }
    }

    /**
     * 新增数据
     * 
     * @param page
     * @return
     */
    public void addRole(Role role)
    {
        // 打印进入方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Enter RoleleDaoImpl addRole() method");
        }

        // 执行新增角色信息
        getSqlMapClientTemplate().insert(ADD_ROLE, role);

        // 获取权限字符串截取
        if (null != role.getPurviewId())
        {
            String[] purStr = role.getPurviewId().split(",");

            for (int i = 0; i < purStr.length; i++)
            {
                role.setActionId(purStr[i]);

                // 执行新增角色权限信息
                getSqlMapClientTemplate().insert(ADD_ROLE_PRIV, role);
            }

        }

        // 打印退出方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Exit RoleleDaoImpl addRole() method");
        }
    }

    /**
     * 判断角色编号是否已经存在
     * 
     * @param role
     * @return
     */
    public boolean isUseRolecode(Role role)
    {
        // 打印进入方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Enter RoleleDaoImpl isUseRolecode() method");
        }

        // 查询总条数
        Integer count = (Integer) getSqlMapClientTemplate().queryForObject(GET_USEROLE_COUNT,
                role);

        // 如果存在返回 true
        if (null != count && count.intValue() > 0)
        {
            return true;
        }
        // 打印退出方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Exit RoleleDaoImpl isUseRolecode() method");
        }

        return false;
    }

    /**
     * 判断是否存在使用该角色的用户信息
     * 
     * @param roleCode
     * @return
     */
    public boolean isUseRoleUser(String roleCode)
    {
        // 打印进入方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Enter RoleleDaoImpl isUseRoleUser() method");
        }

        // 查询总条数
        Integer count = (Integer) getSqlMapClientTemplate().queryForObject(GET_USER_USER,
                roleCode);

        // 如果存在返回 true
        if (null != count && count.intValue() > 0)
        {
            return true;
        }
        // 打印退出方法体日志
        if (log.isInfoEnabled())
        {
            log.info("Exit RoleleDaoImpl isUseRoleUser() method");
        }

        return false;
    }
}
